#include <sys/wait.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>

 int main(int argc, char *argv[])
 {
     int pipefd[2];
     pid_t cpid;
     char buf;

     if (argc != 2) {
      fprintf(stderr, "Usage: %s <string>\n", argv[0]);
      exit(EXIT_FAILURE);
     }

     if (pipe(pipefd) == -1) {
         perror("pipe");
         exit(EXIT_FAILURE);
     }

     cpid = fork();
     if (cpid == -1) {
         perror("fork");
         exit(EXIT_FAILURE);
     }


     if (pipe(pipefd) == -1) {
         perror("pipe");
         exit(EXIT_FAILURE);
     }

     cpid = fork();
     if (cpid == -1) {
         perror("fork");
         exit(EXIT_FAILURE);
     }

     if (cpid == 0) {    /* Child reads from pipe */
         close(pipefd[1]);          /* Close unused write end */
          write(STDOUT_FILENO, "child", 5);
         while (read(pipefd[0], &buf, 1) > 0){
             write(STDOUT_FILENO, &buf, 1);
           }

         write(STDOUT_FILENO, "\n", 1);
         close(pipefd[0]);
         _exit(EXIT_SUCCESS);
     } else {            /* Parent writes argv[1] to pipe */
         close(pipefd[0]);          /* Close unused read end */
         write(pipefd[1], argv[1], strlen(argv[1]));
         close(pipefd[1]);          /* Reader will see EOF */
         wait(NULL);                /* Wait for child */
         exit(EXIT_SUCCESS);
     }
      while(1);
 }
